package uri.controller;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.context.request.RequestScope;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import uri.model.BoardVO;
import uri.model.DiaryVO;
import uri.model.MemberVO;
import uri.model.mypage.ListVO;
import uri.model.mypage.MyPageService;

@Controller
public class MyPageController {
	@Resource(name="myPageServiceImpl")
	private MyPageService myPageService;
	
	//파일 업로드를 위한 path
	private String path=
	"C:\\java-kosta\\goodjob-workspace\\goodjob-ver1\\WebContent\\WEB-INF\\view\\mypage\\fileupload\\";//upload path
	
	/**
	 * 작성자: 장해나
	 * 작성일: 06/30
	 * 파일을 업로드 할 경로에 해당하는 디렉토리를 만들어 주기위해 생성자에서 처리
	 */
	public MyPageController() {
		new File(path).mkdirs();
	}
	@RequestMapping("mypage/auth_myPageMenuView.do")
	public ModelAndView myPageView(){
		return new ModelAndView("my_page_menu.mypage");
	}
	/**
	 * 작성자: 장해나
	 * 작성일: 06/24
	 * 다이어리 전체 리스트를 보여주기 위한 메서드 (페이징처리는 service 계층에서)
	 */
	@RequestMapping("mypage/auth_diaryList.do")
	public ModelAndView diaryList(DiaryVO dvo, HttpSession session){
		dvo.setId( ((MemberVO) session.getAttribute("loginMember")).getId() );
		ListVO lvo=myPageService.diaryList(dvo);
		return new ModelAndView("diaryList.mypage","lvo",lvo);
	} 
	/**
	 * 작성자: 장해나
	 * 작성일: 06/24
	 * 다이어리 글쓰기 폼으로 이동시켜주는 메서드
	 */
	@RequestMapping("mypage/auth_writeDiaryForm.do")
	public String writeDiaryForm(){
		return "writeDiaryForm.mypage";
	}
	/**
	 * 작성자: 장해나
	 * 작성일: 06/24
	 * 다이어리 글 등록 메서드
	 * 
	 * 수정일: 06/26
	 * 다이어리 글 등록시 파일 업로드 처리
	 */
	@RequestMapping("mypage/auth_writeDiary.do")
	public String writeDiary(DiaryVO dvo, HttpSession session) throws IllegalStateException, IOException{
		dvo.setId( ((MemberVO) session.getAttribute("loginMember")).getId() );
		/*
		 * 파일 업로드 처리 
		 */
		MultipartFile mfile=dvo.getUploadFile();
		if(mfile!=null&&!mfile.isEmpty()){			
			// 원본 파일명을 반환 
			String fileName=mfile.getOriginalFilename();
			dvo.setOrgfilename(fileName);
			//시간_파일명으로 변환 
			String newfilename=System.currentTimeMillis()+"_"+fileName;
			dvo.setNewfilename(newfilename);
			// 파일 업로드 
			File copyFile=new File(path+newfilename);
			mfile.transferTo(copyFile);
			myPageService.writeDiary(dvo);
		}else{
			myPageService.writeDiaryNoFile(dvo);
		}
		return "redirect:/mypage/auth_diaryList.do";
	}
	/**
	 * 작성자: 장해나
	 * 작성일: 06/25
	 * 다이어리 글 삭제 메서드
	 * 
	 * 수정일: 06/27
	 * 등록된 파일을 서버에서 지우는 메서드 호출
	 */
	@RequestMapping("mypage/auth_deleteDiary.do")
	public String deleteDiary(DiaryVO dvo, HttpSession session,String filename){
		//System.out.println(filename);
		//System.out.println(dvo.getPage()+"@@@@@@");
		dvo.setId( ((MemberVO) session.getAttribute("loginMember")).getId() );
		myPageService.deleteDiary(dvo);
		//System.out.println(dvo);
		if(filename!=null&&!filename.equals("")){
			deleteFile(filename);
		}
		return "redirect:/mypage/auth_diaryList.do?page="+dvo.getPage();
	}
	/**
	 * 작성자: 장해나
	 * 작성일: 06/27
	 * 등록된 파일을 서버에서 지우는 메서드
	 */
	@RequestMapping("mypage/auth_deleteFile.do")
	private void deleteFile(String filename){
		File f=new File(path+filename);
		boolean result=f.delete();
		System.out.println("delete file :"+result);
	}
	/**
	 * 작성자: 장해나
	 * 작성일: 06/26
	 * 다이어리 글 수정을 위해 내용을 전달해주는 메서드
	 */
	@RequestMapping("mypage/auth_updateDiaryForm.do")
	public ModelAndView updateDiaryForm(DiaryVO dvo, HttpSession session){
		//System.out.println(dvo.getPage());
		String page=dvo.getPage();
		dvo.setId( ((MemberVO) session.getAttribute("loginMember")).getId() );
		DiaryVO rdvo=myPageService.updateDiaryForm(dvo);
		rdvo.setPage(page);
		return new ModelAndView("update_diary_form.mypage","dvo",rdvo);
	}
	/**
	 * 작성자: 장해나
	 * 작성일: 06/26
	 * 다이어리 글 수정 메서드
	 * 
	 * 수정일: 06/27
	 * 파일 수정 처리
	 * 새로운 파일을 업로드 할 수 있도록 처리
	 */
	@RequestMapping("mypage/auth_updateDiary.do")
	public String updateDiary(DiaryVO dvo, HttpSession session) throws IllegalStateException, IOException{
		//System.out.println(dvo.getPage());
		dvo.setId( ((MemberVO) session.getAttribute("loginMember")).getId() );
		MultipartFile mfile=dvo.getUploadFile();
		if(mfile!=null&&mfile.isEmpty()==false){
			String fileName=mfile.getOriginalFilename();
			dvo.setOrgfilename(fileName);
			String newfilename=System.currentTimeMillis()+"_"+fileName;
			dvo.setNewfilename(newfilename);
			File copyFile=new File(path+newfilename);
			mfile.transferTo(copyFile);
			myPageService.updateDiary(dvo);
		}else{
			myPageService.updateDiaryNoFile(dvo);
		}
		return "redirect:/mypage/auth_diaryList.do?page="+dvo.getPage();
	}
	/**
	 * 작성자: 장해나
	 * 작성일: 06/27
	 * 업로드 되어있는 파일을 삭제하는 메서드, ajax 처리
	 */
	@RequestMapping("mypage/auth_deleteUploadFile.do")
	@ResponseBody
	public Map<String,String> deleteUploadFile(String filename){
		System.out.println(filename);
		if(filename!=null&&!filename.equals("")){
			deleteFile(filename);
			System.out.println("upload file delete");
		}		
		Map<String,String> map=new HashMap<String,String>();
		map.put("info", "파일 삭제가 완료되었습니다!");
		return map;
	}
	/**
	 * 작성자: 장해나
	 * 작성일: 06/26
	 * 업로드한 파일을 다운로드하는 메서드
	 */
	@RequestMapping("mypage/auth_diaryFileDownload.do")
	public ModelAndView fileDownload(DiaryVO dvo){
		HashMap<String,String> map=new HashMap<String,String>();
		map.put("path", path);
		map.put("newfilename",dvo.getNewfilename());
		map.put("orgfilename",dvo.getOrgfilename());
		return new ModelAndView("downloadView",map);
	}
	/**
	 * 작성자: 장해나
	 * 작성일: 06/25
	 * 날짜별로 등록된 다이어리 글을 검색하는 메서드
	 */
	@RequestMapping("mypage/auth_searchDiaryByDate.do")
	public ModelAndView searchDiaryByDate(DiaryVO dvo, HttpSession session){
		dvo.setId( ((MemberVO) session.getAttribute("loginMember")).getId() );
		ListVO lvo=myPageService.searchDiaryByDate(dvo);
		return new ModelAndView("search_diary_by_date.mypage","lvo",lvo);
	}
	/**
	 * 작성자: 장해나
	 * 작성일: 06/27
	 * 내용별로 등록된 다이어리 글을 검색하는 메서드
	 */
	@RequestMapping("mypage/auth_searchDiaryByContent.do")
	public ModelAndView searchDiaryByContent(DiaryVO dvo, HttpSession session,String word){
		dvo.setId( ((MemberVO) session.getAttribute("loginMember")).getId() );
		//System.out.println(dvo.getContent());
		if(word!=null){
		dvo.setContent(word);
		}
		ListVO lvo=myPageService.searchDiaryByContent(dvo);
		return new ModelAndView("search_diary_by_content.mypage","lvo",lvo);
	}
	/**
	 * 작성자: 장해나
	 * 작성일: 06/30
	 * 내가 쓴 글의 목록을 가져오는 메서드
	 * 공유, 첨삭, 다이어리 게시판에 접근하여 리스트를 가져온 후
	 * map 에 담아 view 로 전달한다.
	 */
	@RequestMapping("mypage/auth_myListPub.do")
	public ModelAndView myListPub(DiaryVO dvo,BoardVO bvo, HttpSession session){
		bvo.setMemberVO(new MemberVO());
		
		bvo.getMemberVO().setId(((MemberVO) session.getAttribute("loginMember")).getId());
		dvo.setId( ((MemberVO) session.getAttribute("loginMember")).getId() );
		
		List<BoardVO> blist=myPageService.myListPub(bvo);
		//System.out.println(blist);
		Map<String,Object> map=new HashMap<String,Object>();
		map.put("blist", blist);
		List<DiaryVO> dlist=myPageService.myListDiary(dvo);
		map.put("dlist", dlist);
		List<BoardVO> clist=myPageService.myListCorr(bvo);
		map.put("clist", clist);
		return new ModelAndView("my_list.mypage","map",map);
	}
	/**
	 * 작성자: 장해나
	 * 작성일: 07/03
	 * 전체 검색을 위해 view 페이지로 이동시키는 메서드
	 */
	@RequestMapping("mypage/searchForm.do")
	public ModelAndView searchForm(){
		return new ModelAndView("mypage/search_form");
	}
	/**
	 * 작성자: 장해나
	 * 작성일: 07/03
	 * 검색어로 전체 게시판의 검색 메서드 
	 */
	@RequestMapping("mypage/totalSearch.do")
	public ModelAndView totalSearch(String word){
		//System.out.println(map);
		return new ModelAndView("total_result.mypage","map",myPageService.searchTotal(word));
	}
}


